from pandasai.llm.local_llm import LocalLLM
from pandasai import SmartDataframe
import streamlit as st
import pandas as pd
from io import StringIO
import chardet

# 初始化模型
model = LocalLLM(
    api_base="http://localhost:11434/v1",
    model="qwen2.5:32b"
)

# 页面设置
st.set_page_config(page_title="智能数据分析助手", layout="wide")

# 加载样式
with open("style.css", encoding="utf-8") as f:
    st.markdown(f"<style>{f.read()}</style>", unsafe_allow_html=True)

# 页面头部
st.markdown("""
<div class="header-card">
    <h1> 智能数据分析助手</h1>
    <p>上传 Excel/CSV 文件，用自然语言提问即可分析数据。</p>
</div>
""", unsafe_allow_html=True)

# 上传模块
st.markdown("###  上传数据文件")
uploaded_file = st.file_uploader("请上传 .csv 或 .xlsx 文件", type=['csv', 'xlsx'])
st.markdown('</div>', unsafe_allow_html=True)

# 文件处理逻辑
if uploaded_file:
    try:
        # CSV 或 Excel 读取
        if uploaded_file.name.endswith('.csv'):
            raw_data = uploaded_file.getvalue()
            try:
                decoded_data = raw_data.decode('utf-8')
            except UnicodeDecodeError:
                encoding = chardet.detect(raw_data)['encoding']
                decoded_data = raw_data.decode(encoding)
            df = pd.read_csv(StringIO(decoded_data))
        else:
            df = pd.read_excel(uploaded_file)

        # 展示数据预览
        st.markdown('<div class="card">', unsafe_allow_html=True)
        st.success(" 文件加载成功！")
        st.markdown("###  数据预览（前5行）")
        st.dataframe(df.head(5), use_container_width=True)
        st.markdown('</div>', unsafe_allow_html=True)

        # 智能分析区域
        st.markdown('<div class="card">', unsafe_allow_html=True)
        st.markdown("###  请输入分析需求（例如：“销售额最高的是哪个产品？”）")
        prompt = st.text_area("", placeholder="例如：分析不同渠道的销售趋势", height=100)

        if st.button(" 开始分析", use_container_width=True):
            with st.spinner(" 模型正在思考，请稍等..."):
                try:
                    smart_df = SmartDataframe(df, config={"llm": model})
                    system_prompt = "请用中文完整地回答问题，结构简洁明了。例如：某渠道销售额为xx元。"
                    result = smart_df.chat(system_prompt + prompt)
                    st.markdown("###  分析结果")
                    st.success(result)
                except Exception as e:
                    st.error(f" 分析失败：{e}")
        st.markdown('</div>', unsafe_allow_html=True)

    except Exception as e:
        st.error(f" 文件处理失败：{str(e)}")
else:
    st.info(" 请上传一个数据文件后再进行分析")
